<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>gvn user guide</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:epg@epg.corp.google.com" />
</head>

<body style="background-color: white">

<p><a name="__index__"></a></p>
<!-- INDEX BEGIN -->

<ul>

	<li><a href="#name">NAME</a></li>
	<li><a href="#description">DESCRIPTION</a></li>
	<li><a href="#subcommands">SUBCOMMANDS</a></li>
	<ul>

		<li><a href="#help"><strong>help</strong></a></li>
		<li><a href="#change"><strong>change</strong></a></li>
		<li><a href="#changes__all___user_username_"><strong>changes</strong> [<strong>-all</strong> | <strong>-user</strong> <em>username</em>]</a></li>
		<li><a href="#mail__reviewers_reviewer_______cc_ccc_______c_change___path_____"><strong>mail</strong> [<strong>-reviewers</strong> <em>reviewer</em>,...] [<strong>-cc</strong> <em>cc</em>C,...] [<strong>-c</strong> <em>change</em>] [<em>path</em> ...]</a></li>
		<li><a href="#review_change___revision"><strong>review</strong> <em>change</em> | <em>revision</em></a></li>
		<li><a href="#submit_c_change"><strong>submit</strong> <strong>-c</strong> <em>change</em></a></li>
		<li><a href="#snapshot__c_change_"><strong>snapshot</strong> [<strong>-c</strong> <em>change</em>]</a></li>
		<li><a href="#ack_change"><strong>ack</strong> <em>change</em></a></li>
		<li><a href="#describe_change___revision"><strong>describe</strong> <em>change</em> | <em>revision</em></a></li>
		<li><a href="#diff__c_change___path____"><strong>diff</strong> [-c <em>change</em> | <em>path</em>...]</a></li>
		<li><a href="#nothave"><strong>nothave</strong></a></li>
		<li><a href="#opened"><strong>opened</strong></a></li>
		<li><a href="#rdiff"><strong>rdiff</strong></a></li>
		<li><a href="#revert"><strong>revert</strong></a></li>
	</ul>

	<li><a href="#global_options">GLOBAL OPTIONS</a></li>
	<li><a href="#projects">PROJECTS</a></li>
	<li><a href="#configuration">CONFIGURATION</a></li>
	<li><a href="#bugs">BUGS</a></li>
</ul>
<!-- INDEX END -->

<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p><strong>gvn</strong></p>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>XXX next three paragraphs copied from pamg's suggested help text</p>
<p>Creating a changebranch publishes its files for review, exactly as
they are in your working copy.  Use ``gvn mail'' to request review.  If
you make additional changes to files in the changebranch after
creating it, use ``gvn snapshot'' to republish them.</p>
<p>Before a changebranch can be submitted, it must be reviewed and
acknowledged by one or more reviewers.  The author of a changebranch
requests review with ``gvn mail''.  Once you, the reviewer, feel that
the files in the changebranch are ready to be submitted *exactly* as
they are, run ``gvn ack &lt;changebranch&gt;''.</p>
<p>If the author makes more changes to files after you've acknowledged the
changebranch, you'll have to acknowledge the new version before it can be
submitted.</p>
<p>
</p>
<hr />
<h1><a name="subcommands">SUBCOMMANDS</a></h1>
<p>
</p>
<h2><a name="help"><strong>help</strong></a></h2>
<p>show help; identical to <strong>--help</strong></p>
<p>
</p>
<h2><a name="change"><strong>change</strong></a></h2>
<dl>
<dt><strong><a name="item_change__5b_2dc_change_5d__5b_2d_2dadd_5d_path__2e_"><strong>change</strong> [<strong>-c</strong> <em>change</em>] [<strong>--add</strong>] <em>path</em> ...</a></strong>

<dd>
<p>Add <em>path</em>s to <em>change</em>, creating it if it does not exist.  If
<em>change</em> is not specified, generate a random name.</p>
</dd>
</li>
<dt><strong><a name="item_change__2dc_change__2d_2dremove_path__2e_2e_2e"><strong>change</strong> <strong>-c</strong> <em>change</em> <strong>--remove</strong> <em>path</em> ...</a></strong>

<dd>
<p>Remove <em>path</em>s from <em>change</em>.</p>
</dd>
</li>
<dt><strong><a name="item_change__2dc_change__2d_2ddelete"><strong>change</strong> <strong>-c</strong> <em>change</em> <strong>--delete</strong></a></strong>

<dd>
<p>Delete <em>change</em>.</p>
</dd>
<dd>
<p>[XXX --delete vs --remove is confusing; suggestions welcome]</p>
</dd>
</li>
</dl>
<p>If <em>--non-interactive</em> is not specified, the first two forms run the
user's editor (see <strong>--editor-cmd</strong>) on a form, allowing the user to
add and remove files to and from <em>change</em> and to edit the change
description (log message).</p>
<p>If you don't specify <em>path</em>s, gvn will run $EDITOR on a form showing
all modified paths in this changebranch or no changebranch at all.
You can move paths from one group to another in your editor, as well
as update the change description.</p>
<dl>
<dt><strong><a name="item__2d_2dforce_2dchange"><strong>--force-change</strong></a></strong>

<dd>
<p>force validity of changebranch name</p>
</dd>
</li>
</dl>
<p>
</p>
<h2><a name="changes__all___user_username_"><strong>changes</strong> [<strong>--all</strong> | <strong>--user</strong> <em>username</em>]</a></h2>
<p>List changebranches.</p>
<p>Without <strong>--all</strong> or <strong>--user</strong>, list local changebranches.</p>
<p>
</p>
<h2><a name="mail__reviewers_reviewer_______cc_ccc_______c_change___path_____"><strong>mail</strong> [<strong>--reviewers</strong> <em>reviewer</em>,...] [<strong>--cc</strong> <em>cc</em>C,...] [<strong>-c</strong> <em>change</em>] [<em>path</em> ...]</a></h2>
<p>You can just run <strong>gvn mail</strong> without arguments and it will run the
change editor (describe above) and create a new changebranch for you.
You can give it a <strong>-c</strong> option and it will use that name for the new
branch.</p>
<p>If CHANGE does not exist, it will be created using the files in PATH,
and an editor will be launched allowing you to enter a description and
move files into and out of the changebranch.  If no change name is
given, a random one will be generated.</p>
<p>gvn will then launch an editor with the body of the mail to be sent,
allowing you to edit it if you wish.  A text diff of the files in the
changebranch (truncated, if necessary) appears at the bottom of the
message.</p>
<dl>
<dt><strong><a name="item__2d_2dreviewers_reviewer_2c_2e_2e_2e"><strong>--reviewers</strong> <em>reviewer</em>,...</a></strong>

<dd>
<p>foo</p>
</dd>
</li>
</dl>
<p>
</p>
<h2><a name="review_change___revision"><strong>review</strong> <em>change</em> | <em>revision</em></a></h2>
<p>Print a description of a changebranch or revision, including the
current revision number, user, date, change description, the list of
modified files, and the diff.</p>
<p>
</p>
<h2><a name="submit_c_change"><strong>submit</strong> <strong>-c</strong> <em>change</em></a></h2>
<p>foo</p>
<p>
</p>
<h2><a name="snapshot__c_change_"><strong>snapshot</strong> [<strong>-c</strong> <em>change</em>]</a></h2>
<p>Commit the current contents of each file in <em>change</em> to the
changebranch.  If <em>change</em> is omitted, snapshot all local
changebranches.  Replace the change <a href="#item_description"><code>description(s)</code></a> if <em>file</em> or
<em>message</em> is specified.</p>
<dl>
<dt><strong><a name="item__2dq__7c__2d_2dquiet"><strong>-q</strong> | <strong>--quiet</strong></a></strong>

<dt><strong><a name="item__2d_2deditor_2dcmd_editor"><strong>--editor-cmd</strong> <em>editor</em></a></strong>

<dt><strong><a name="item__2d_2dencoding_encoding"><strong>--encoding</strong> <em>encoding</em></a></strong>

<dt><strong><a name="item__2d_2dfile__7c__2df_file_2c__2d_2dmessage__7c__2dm"><strong>--file</strong> | <strong>-F</strong> <em>file</em>, <strong>--message</strong> | <strong>-m</strong> <em>message</em>, <strong>--force-log</strong></a></strong>

<dt><strong><a name="item__2d_2dnon_2dinteractive"><strong>--non-interactive</strong></a></strong>

<dt><strong><a name="item__2d_2dno_2dauth_2dcache_2c__2d_2dusername_2c__2d_2"><strong>--no-auth-cache</strong>, <strong>--username</strong>, <strong>--password</strong></a></strong>

<dd>
<p>auth foo</p>
</dd>
</li>
</dl>
<p>
</p>
<h2><a name="ack_change"><strong>ack</strong> <em>change</em></a></h2>
<p>Acknowledge a changebranch.</p>
<p>
</p>
<h2><a name="describe_change___revision"><strong>describe</strong> <em>change</em> | <em>revision</em></a></h2>
<p>Print a description of a changebranch or revision, including the
current revision number, user, date, change description, and the list
of modified files.</p>
<p>
</p>
<h2><a name="diff__c_change___path____"><strong>diff</strong> [-c <em>change</em> | <em>path</em>...]</a></h2>
<p>Display the changes made to the paths changed in CHANGE or PATHS.
Without CHANGE or PATHs, display all changes in the working copy.</p>
<p>
</p>
<h2><a name="nothave"><strong>nothave</strong></a></h2>
<p>Lists all files in your working copy that have never been added to the
repository.  Note that files that have been added, but not yet
submitted, will not be shown, even if they aren't included in any
changebranch.</p>
<p>
</p>
<h2><a name="opened"><strong>opened</strong></a></h2>
<p>Show the files in your client that have been changed from the versions
in the repository, or that have been added (using ``gvn add'').</p>
<p>Output format is the same as <strong>svn status</strong>, with two differences.
``--- Changebranch'' lines (similar to ``--- Changelist'' lines) are used
to group status lines for changebranched paths.  Each status line has
an additional column, inserted at the front: if this column is blank,
this path is up-to-date with the changebranch (or not changebranched
at all); if it is a ``*'', this path needs to be snapshotted.</p>
<p>
</p>
<h2><a name="rdiff"><strong>rdiff</strong></a></h2>
<p>Display the differences between two revisions or repository paths.
usage: 1. rdiff [-c M | -r N[:M]] [URL[@REV]...]
       2. rdiff [-r N[:M]] --old=OLD-URL[@OLDREV] [--new=NEW-URL[@NEWREV]]                 [PATH...]
       3. rdiff OLD-URL[@OLDREV] NEW-URL[@NEWREV]</p>
<pre>
  1. Display the changes made to URLs as they are seen in REV between two
     revisions.  N must be specified and M defaults to HEAD.  The '-c M' option
     is equivalent to '-r N:M' where N = M-1.  Using '-c -M' does the reverse:
     '-r M:N' where N = M-1.</pre>
<pre>
  2. Display the differences between OLD-URL as it was seen in OLDREV and
     NEW-URL as it was seen in NEWREV.  PATHs, if given, are relative to OLD-URL
     and NEW-URL and restrict the output to differences for those paths.
     OLD-URL and NEW-URL must be URL[@REV].  NEW-URL defaults to OLD-URL if not
     specified.  -r N makes OLDREV default to N, -r N:M makes OLDREV default to
     N and NEWREV default to M.</pre>
<pre>
  3. Shorthand for 'gvn rdiff --old=OLD-URL[@OLDREV] --new=NEW-URL[@NEWREV]'</pre>
<p>
</p>
<h2><a name="revert"><strong>revert</strong></a></h2>
<p>Revert the changes made to the paths changed in <em>change</em> or <em>path</em>s,
restoring them to the pristine versions from the repository.  This can
also be used to undo ``gvn add''.</p>
<p>This command is irreversible.  However, any changes published or
checkpointed into a changebranch can still be retrieved from that
changebranch's revision.</p>
<p>
</p>
<hr />
<h1><a name="global_options">GLOBAL OPTIONS</a></h1>
<p>Options specific to a subcommand are documented exclusively in that
subcommand's section, above.  Many options are used by many
subcommands; they are listed in the subcommand's section, but fully
documented here.</p>
<p>All subcommands accept the <strong>--help</strong>, <strong>--gvn-config-dir</strong>,
<strong>--config-dir</strong>, and <strong>--diag</strong> options.</p>
<p>XXX i haven't gone over these to verify that they're all global; some
might belong in a subcommand section.  Also these need to be grouped,
all the log options together, auth options, ...  Finally, many of
these are only accepted by wrapped svn subcommands, and thus should
not be here at all.</p>
<dl>
<dt><strong><a name="item__2d_2dconfig_2ddir_config_2ddir"><strong>--config-dir</strong> <em>config-dir</em></a></strong>

<dd>
<p>read user configuration files from directory <em>config-dir</em></p>
</dd>
</li>
<dt><strong><a name="item__2d_2dgvn_2dconfig_2ddir_gvn_2dconfig_2ddir"><strong>--gvn-config-dir</strong> <em>gvn-config-dir</em></a></strong>

<dd>
<p>read user gvn configuration files from directory <em>gvn-config-dir</em></p>
</dd>
</li>
<dt><strong><a name="item__2d_2dauto_2dprops"><strong>--auto-props</strong></a></strong>

<dd>
<p>enable automatic properties</p>
</dd>
</li>
<dt><strong><a name="item__2d_2ddiag"><strong>--diag</strong></a></strong>

<dd>
<p>Show diagnostics about what gvn is doing, including full tracebacks
for all errors.</p>
</dd>
</li>
<dt><strong><a name="item__2d_2ddiff_2dcmd_diff_2dcmd"><strong>--diff-cmd</strong> <em>diff-cmd</em></a></strong>

<dd>
<p>use <em>diff-cmd</em> as diff command</p>
</dd>
</li>
<dt><strong><a name="item__2d_2ddiff3_2dcmd_diff3_2dcmd"><strong>--diff3-cmd</strong> <em>diff3-cmd</em></a></strong>

<dd>
<p>use <em>diff3-cmd</em> as merge command</p>
</dd>
</li>
<dt><strong><a name="item__2d_2ddry_2drun"><strong>--dry-run</strong></a></strong>

<dd>
<p>try operation but make no changes</p>
</dd>
</li>
<dt><strong><a name="item__2d_2deditor_2dcmd_editor_2dcmd"><strong>--editor-cmd</strong> <em>editor-cmd</em></a></strong>

<dd>
<p>use <em>editor-cmd</em> as external editor</p>
</dd>
</li>
<dt><strong><strong>--encoding</strong> <em>encoding</em></strong>

<dd>
<p>treat value as being in charset encoding <em>encoding</em></p>
</dd>
</li>
<dt><strong><a name="item__2d_2dfile__7c__2df_file"><strong>--file</strong> | <strong>-F</strong> <em>file</em></a></strong>

<dd>
<p>read log message from file <em>file</em> XXX propset, others?</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dforce"><strong>--force</strong></a></strong>

<dd>
<p>force operation to run</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dforce_2dlog"><strong>--force-log</strong></a></strong>

<dd>
<p>force validity of log message source</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dignore_2dancestry"><strong>--ignore-ancestry</strong></a></strong>

<dd>
<p>ignore ancestry when calculating merges</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dignore_2dexternals"><strong>--ignore-externals</strong></a></strong>

<dd>
<p>ignore externals definitions</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dincremental"><strong>--incremental</strong></a></strong>

<dd>
<p>give output suitable for concatenation</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dlimit_limit"><strong>--limit</strong> <em>limit</em></a></strong>

<dd>
<p>maximum number of log entries</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dmessage__7c__2dm_message"><strong>--message</strong> | <strong>-m</strong> <em>message</em></a></strong>

<dd>
<p>specify log message <em>message</em></p>
</dd>
</li>
<dt><strong><a name="item__2d_2dnative_2deol_native_2deol"><strong>--native-eol</strong> <em>native-eol</em></a></strong>

<dd>
<p>use a different EOL marker than the standard
                             system marker for files with the svn:eol-style
                             property set to 'native'.
                             <em>native-eol</em> may be one of 'LF', 'CR', 'CRLF'</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dnew_new"><strong>--new</strong> <em>new</em></a></strong>

<dd>
<p>use <em>new</em> as the newer target</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dno_2dauth_2dcache"><strong>--no-auth-cache</strong></a></strong>

<dd>
<p>do not cache authentication tokens</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dno_2dauto_2dprops"><strong>--no-auto-props</strong></a></strong>

<dd>
<p>disable automatic properties</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dno_2ddiff_2ddeleted"><strong>--no-diff-deleted</strong></a></strong>

<dd>
<p>do not print differences for deleted files</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dno_2dignore"><strong>--no-ignore</strong></a></strong>

<dd>
<p>disregard default and svn:ignore property ignores</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dno_2dunlock"><strong>--no-unlock</strong></a></strong>

<dd>
<p>don't unlock the targets</p>
</dd>
</li>
<dt><strong><strong>--non-interactive</strong></strong>

<dd>
<p>do no interactive prompting</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dnon_2drecursive__7c__2dn"><strong>--non-recursive</strong> | <strong>-N</strong></a></strong>

<dd>
<p>operate on single directory only</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dnotice_2dancestry"><strong>--notice-ancestry</strong></a></strong>

<dd>
<p>notice ancestry when calculating differences</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dold_old"><strong>--old</strong> <em>old</em></a></strong>

<dd>
<p>use <em>old</em> as the older target</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dpassword_password"><strong>--password</strong> <em>password</em></a></strong>

<dd>
<p>specify a password <em>password</em></p>
</dd>
</li>
<dt><strong><a name="item__2d_2dproject_project"><strong>--project</strong> <em>project</em></a></strong>

<dd>
<p>use project <em>project</em></p>
</dd>
</li>
<dt><strong><a name="item__2d_2dquiet__7c__2dq"><strong>--quiet</strong> | <strong>-q</strong></a></strong>

<dd>
<p>print as little as possible</p>
</dd>
</li>
<dt><strong><a name="item__2d_2drecursive__7c__2dr"><strong>--recursive</strong> | <strong>-R</strong></a></strong>

<dd>
<p>descend recursively</p>
</dd>
</li>
<dt><strong><a name="item__2d_2drelocate"><strong>--relocate</strong></a></strong>

<dd>
<p>relocate via URL-rewriting</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dremove"><strong>--remove</strong></a></strong>

<dd>
<p>remove from changebranch</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dreviewers_reviewers"><strong>--reviewers</strong> <em>reviewers</em></a></strong>

<dd>
<p>comma-separated list of reviewer addresses</p>
</dd>
</li>
<dt><strong><a name="item__2d_2drevision__7c__2dr_revision"><strong>--revision</strong> | <strong>-r</strong> <em>revision</em></a></strong>

<dd>
<p><em>revision</em> (some commands also take <em>revision</em>1:<em>revision</em>2 range)
                             A revision argument can be one of:
                                NUMBER       revision number
                                '{' DATE '}' revision at start of the date
                                'HEAD'       latest in repository
                                'BASE'       base rev of item's working copy
                                'COMMITTED'  last commit at or before BASE
                                'PREV'       revision just before COMMITTED</p>
</dd>
</li>
<dt><strong><a name="item__2d_2drevprop"><strong>--revprop</strong></a></strong>

<dd>
<p>operate on a revision property (use with -r)</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dshow_2dupdates__7c__2du"><strong>--show-updates</strong> | <strong>-u</strong></a></strong>

<dd>
<p>display update information</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dstop_2don_2dcopy"><strong>--stop-on-copy</strong></a></strong>

<dd>
<p>do not cross copies while traversing history</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dstrict"><strong>--strict</strong></a></strong>

<dd>
<p>use strict semantics</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dsummarize"><strong>--summarize</strong></a></strong>

<dd>
<p>show a summary of the results</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dtargets_targets"><strong>--targets</strong> <em>targets</em></a></strong>

<dd>
<p>pass contents of file <em>targets</em> as additional args</p>
</dd>
</li>
<dt><strong><a name="item__2d_2duser_user"><strong>--user</strong> <em>user</em></a></strong>

<dd>
<p>operate on USER (does not affect auth)</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dusername_username"><strong>--username</strong> <em>username</em></a></strong>

<dd>
<p>specify a username <em>username</em></p>
</dd>
</li>
<dt><strong><a name="item__2d_2dverbose__7c__2dv"><strong>--verbose</strong> | <strong>-v</strong></a></strong>

<dd>
<p>print extra information</p>
</dd>
</li>
<dt><strong><a name="item__2d_2dxml"><strong>--xml</strong></a></strong>

<dd>
<p>output in XML</p>
</dd>
</li>
</dl>
<p>
</p>
<hr />
<h1><a name="projects">PROJECTS</a></h1>
<p><strong>gvn</strong> thinks in terms of <em>project</em>s.  A <em>project</em> is a directory in
a repository that contains at least one code line (typically ``trunk''),
or is itself a code line.  The project directory itself may have
properties which change <strong>gvn</strong>'s behavior.</p>
<p>Today, the only property is <strong>gvn:project</strong>, and it contains a Python
pickle of a dict with the following keys.  In the future, we'll
use Windows ini (Python ConfigParser) instead of pickle.</p>
<dl>
<dt><strong><a name="item_bug_2dlinks">bug-links</a></strong>

<dd>
<p>List of (regular expression, URL) tuples for bug numbers in the
<strong>gvn:bug</strong> and <strong>svn:log</strong> revision properties.  The actual bug number
should be grouped with parentheses, and then referred to in the URL,
for example:</p>
</dd>
<dd>
<pre>
  'bug-links': [(r'(?i)(bug|issue)\s*#?\s*(\d+)',
                 r'<a href="http://issuetracker/detail?id=">http://issuetracker/detail?id=</a>\2')],</pre>
</dd>
<dd>
<p>This matches the ``13'' in ``bug 13'' in the second group, so use ``\2'' to
get the number 13.</p>
</dd>
</li>
<dt><strong><a name="item_change_2dbranch_2dbase">change-branch-base</a></strong>

<dd>
<p>Directory in which to store change branches, defaults to <strong>//changes</strong>.
If this begins with a / it is relative to the repository root, else it
is relative to the project URL.</p>
</dd>
</li>
<dt><strong><a name="item_diff_2dlines">diff-lines</a></strong>

<dd>
<p>Number of lines of diff to include in the gvn mail.  This should be in
the format specifier in the mail template, really, something like
%(200)diff for 200 lines or %diff for the whole thing.</p>
</dd>
</li>
<dt><strong><a name="item_mail_2dtemplate">mail-template</a></strong>

<dd>
<p>Template used for <strong>gvn mail</strong>.  The following format specifiers
(e.g. ``%(project)s''):</p>
</dd>
<dl>
<dt><strong><a name="item_project">project</a></strong>

<dd>
<p>project url</p>
</dd>
</li>
<dt><strong><a name="item_change_name">change_name</a></strong>

<dd>
<p>user/name@rev</p>
</dd>
</li>
<dt><strong><a name="item_change_name_at_head">change_name_at_head</a></strong>

<dd>
<p>user/name</p>
</dd>
</li>
<dt><strong><a name="item_description">description</a></strong>

<dd>
<p>svn:log</p>
</dd>
</li>
<dt><strong><a name="item_short_desc">short_desc</a></strong>

<dd>
<p>First 39 chars of svn:log; like diff-lines, this should just be
specified in the mail template directly, but not yet.</p>
</dd>
</li>
<dt><strong><a name="item_shortdiff">shortdiff</a></strong>

<dd>
<p>diff-lines of diff</p>
</dd>
</li>
</dl>
</dl>
<p>Today project files are discovered in this way:</p>
<p>First, if <strong>gvn</strong> has a working copy, it uses that URL to find a
project file, ignoring <strong>--project</strong> option.  If it finds no matching
project file, <strong>gvn</strong> uses the wc top URL as the project URL.</p>
<p>Next, if <strong>gvn</strong> has a <strong>--project</strong> option, it uses looks for a project
file named <em>project</em> or a project file referencing the URL if
<em>project</em> is a URL.</p>
<p>Finally, with neither a working copy nor a <strong>--project</strong> option, <strong>gvn</strong>
looks for a project file named ``default''.</p>
<p>We're probably going to change the working copy discovery method to
instead get the project root from the .gvn file, and that will be
filled in a checkout time.</p>
<p>
</p>
<hr />
<h1><a name="configuration">CONFIGURATION</a></h1>
<p>~/.gvn/config and /etc/gvn/config are of the form (with defaults):</p>
<pre>
  [external]
  diff_command = internal
  smtp_server = smtp</pre>
<dl>
<dt><strong><a name="item_diff_command"><strong>diff_command</strong></a></strong>

<dd>
<p>Specify the command to use for <strong>gvn review</strong>'s diffs; in the future,
<strong>gvn diff</strong> and <strong>gvn rdiff</strong> will use this as well.</p>
</dd>
</li>
<dt><strong><a name="item_smtp_server"><strong>smtp_server</strong></a></strong>

<dd>
<p>Specify the name of the SMTP server <strong>gvn mail</strong> uses to send the
review request.</p>
</dd>
</li>
</dl>
<p>Project files don't have derived defaults; see each directive's
description for details.</p>
<pre>
  [project]
  url
  username
  email_address
  email_domain</pre>
<dl>
<dt><strong><a name="item_url"><strong>url</strong></a></strong>

<dd>
<p>Specify the url of the project root.</p>
</dd>
<dd>
<p>In order to match usernames with repositories gvn matches the
repository root url in your working copy with the first matching file
in ~/.gvn/projects/&lt;project&gt;.</p>
</dd>
<dd>
<p>Defaults to the working copy url.</p>
</dd>
</li>
<dt><strong><a name="item_username"><strong>username</strong></a></strong>

<dd>
<p>Specify the username to authenticate, as well as the changebranch path
(e.g. //changes/basil).</p>
</dd>
<dd>
<p>Defaults to the local system username.</p>
</dd>
</li>
<dt><strong><a name="item_email_address"><strong>email_address</strong></a></strong>

<dd>
<p>Specify the email address <strong>gvn mail</strong> uses in the From header.</p>
</dd>
<dd>
<p>Defaults to the value of the <strong>EMAIL</strong> environment variable if set,
else to username @ the last two components of the host's fully
qualified domain name (e.g. <a href="mailto:basil@example.com">basil@example.com</a> for the user basil on
the host torquay.corp.example.com).</p>
</dd>
</li>
<dt><strong><a name="item_email_domain"><strong>email_domain</strong></a></strong>

<dd>
<p>Specify the domain name <strong>gvn mail</strong> appends to <em>reviewers</em> specified
with the <strong>--reviewers</strong> option.</p>
</dd>
<dd>
<p>By default, <strong>gvn mail</strong> uses the <em>reviewers</em> addresses verbatim.</p>
</dd>
</li>
</dl>
<p>
</p>
<hr />
<h1><a name="bugs">BUGS</a></h1>
<dl>
<dt><strong><a name="item_must_update_wc_top_after_adding_new_directory">Must update wc top after adding new directory</a></strong>

<dd>
<pre>
    svn mkdir foo
    svn ci foo
    svn add foo/bar
    gvn change -c newchange foo/bar</pre>
</dd>
<dd>
<p>doesn't work; copies top@rev-with-no-foo then tries to copy into
foo/bar, but there's no foo.</p>
</dd>
<dd>
<p>Given that:</p>
</dd>
<dd>
<pre>
    svn mkdir foo &amp;&amp; svn ci foo
    svn rm foo &amp;&amp; svn ci foo
    touch foo &amp;&amp; svn add foo</pre>
</dd>
<dd>
<p>doesn't work without an 'svn up' before the 'svn add foo', this isn't
really a big deal.</p>
</dd>
</dl>

</body>

</html>
